# LeetCode 110、平衡二叉树

# 一、题目描述

给定一个二叉树,判断它是否是高度平衡的二叉树。

本题中,一棵高度平衡二叉树定义为:

一个二叉树每个节点 的左右两个子树的高度差的绝对值不超过 1 。

# 二、题目解析

# 三、参考代码

# 1、Java 代码

// 登录 AlgoMooc 官网获取更多算法图解
// https://www.algomooc.com
// 作者:程序员吴师兄
// 代码有看不懂的地方一定要私聊咨询吴师兄呀
// 平衡二叉树( LeetCode 110 ):https://leetcode-cn.com/problems/balanced-binary-tree
class Solution {
    public boolean isBalanced(TreeNode root) {
         // 自底向上判断,只要返现有叶子树出现非平衡二叉树的情况,那么就是不是平衡二叉树了
        return recur(root) != -1;
    }

    private int recur(TreeNode curNode) {
        
        // 递归终止条件
        // 如果当前节点 curNode 为空,那么高度就是 0
        if (curNode == null) return 0;

        // 递归的计算当前节点 curNode 的左子树高度
        int left = recur(curNode.left);

        // 如果发现为 -1,即表示左子树中出现了高度差大于 2 的情况,已经不是平衡二叉树了,可以直接返回这个结果给上层
        // 提前终止了后续的判断
        if(left == -1) return -1;

        // 递归的计算当前节点 curNode 的右子树高度
        int right = recur(curNode.right);

        // 如果发现为 -1,即表示右子树中出现了高度差大于 2 的情况,已经不是平衡二叉树了,可以直接返回这个结果给上层
        // 提前终止了后续的判断
        if(right == -1) return -1;

        // 1、否则说明在 curNode 的左子树中没有发现不是平衡二叉树的情况
        // 2、否则说明在 curNode 的右子树中没有发现不是平衡二叉树的情况
        // 因此计算一下当前节点 curNode 是否是平衡二叉树
        // 即计算 curNode 的左子树高度与右子树高度差
        // 如果发现小于 2,那么返回以当前节点 curNode 为根节点的子树的最大高度
        // 即节点 curNode 的左右子树中最大高度加 1 
        return Math.abs(left - right) < 2 ? Math.max(left, right) + 1 : -1;
    }
}

# **2、**C++ 代码

// 登录 AlgoMooc 官网获取更多算法图解
// https://www.algomooc.com
// 作者:程序员吴师兄
// 代码有看不懂的地方一定要私聊咨询吴师兄呀
// 平衡二叉树( LeetCode 110 ):https://leetcode-cn.com/problems/balanced-binary-tree
class Solution {
public:
    bool isBalanced(TreeNode* root) {
         // 自底向上判断,只要返现有叶子树出现非平衡二叉树的情况,那么就是不是平衡二叉树了
        return recur(root) != -1;
    }
private:
    int recur(TreeNode* curNode) {
        
        // 递归终止条件
        // 如果当前节点 curNode 为空,那么高度就是 0
        if (curNode == NULL) return 0;

        // 递归的计算当前节点 curNode 的左子树高度
        int left = recur(curNode->left);

        // 如果发现为 -1,即表示左子树中出现了高度差大于 2 的情况,已经不是平衡二叉树了,可以直接返回这个结果给上层
        // 提前终止了后续的判断
        if(left == -1) return -1;

        // 递归的计算当前节点 curNode 的右子树高度
        int right = recur(curNode->right);

        // 如果发现为 -1,即表示右子树中出现了高度差大于 2 的情况,已经不是平衡二叉树了,可以直接返回这个结果给上层
        // 提前终止了后续的判断
        if(right == -1) return -1;

        // 1、否则说明在 curNode 的左子树中没有发现不是平衡二叉树的情况
        // 2、否则说明在 curNode 的右子树中没有发现不是平衡二叉树的情况
        // 因此计算一下当前节点 curNode 是否是平衡二叉树
        // 即计算 curNode 的左子树高度与右子树高度差
        // 如果发现小于 2,那么返回以当前节点 curNode 为根节点的子树的最大高度
        // 即节点 curNode 的左右子树中最大高度加 1 
        return abs(left - right) < 2 ? max(left, right) + 1 : -1;
    }
};

# 3、Python 代码

# 登录 AlgoMooc 官网获取更多算法图解
# https://www.algomooc.com
# 作者:程序员吴师兄
# 代码有看不懂的地方一定要私聊咨询吴师兄呀
# 平衡二叉树( LeetCode 110 ):https://leetcode-cn.com/problems/balanced-binary-tree
class Solution:
    def isBalanced(self, root: TreeNode) -> bool:
         # 自底向上判断,只要返现有叶子树出现非平衡二叉树的情况,那么就是不是平衡二叉树了
        return self.recur(root) != -1
    

    def recur(self, curNode: TreeNode):
        
        # 递归终止条件
        # 如果当前节点 curNode 为空,那么高度就是 0
        if not curNode : return 0

        # 递归的计算当前节点 curNode 的左子树高度
        left = self.recur(curNode.left)

        # 如果发现为 -1,即表示左子树中出现了高度差大于 2 的情况,已经不是平衡二叉树了,可以直接返回这个结果给上层
        # 提前终止了后续的判断
        if left == -1 : return -1

        # 递归的计算当前节点 curNode 的右子树高度
        right = self.recur(curNode.right)

        # 如果发现为 -1,即表示右子树中出现了高度差大于 2 的情况,已经不是平衡二叉树了,可以直接返回这个结果给上层
        # 提前终止了后续的判断
        if right == -1 : return -1

        # 1、否则说明在 curNode 的左子树中没有发现不是平衡二叉树的情况
        # 2、否则说明在 curNode 的右子树中没有发现不是平衡二叉树的情况
        # 因此计算一下当前节点 curNode 是否是平衡二叉树
        # 即计算 curNode 的左子树高度与右子树高度差
        # 如果发现小于 2,那么返回以当前节点 curNode 为根节点的子树的最大高度
        # 即节点 curNode 的左右子树中最大高度加 1 
        return max(left, right) + 1 if abs(left - right) < 2 else -1